
import 'dart:async';

import 'package:flutter/services.dart';

class Fplugin {

  //这个是方法通道
  static const MethodChannel _methodChannel = const MethodChannel('fplugin.method');
  //这个是事件通道
  static const EventChannel _eventChannel = const EventChannel("fplugin.event", const StandardMethodCodec());

  Fplugin.init(){
    //flutter端监听原生调用flutter的方法的处理
    Fplugin._methodChannel.setMethodCallHandler(flutterDealNativeMethod);

    //flutter端监听原生通过事件调用flutter的方法的处理
    Fplugin._eventChannel
        .receiveBroadcastStream()
        .listen(_onEvent, onError: _onError);
  }

  /********************************************** 原生事件调用flutter方法的监听 ******************************************************/
  // 事件数据接收
  void _onEvent(Object value) {
    final Map<dynamic, dynamic> res = value;
    final  String item1 = res['item1'];
    final  String item2 = res['item2'];
    print('原生通过事件调用了flutterMethod方法！！！');
    print('原生通过事件传递给flutter的参数是：' + item1 + " " + item2);
  }

  // 事件错误处理
  void _onError(dynamic) {}


  /********************************************** 原生调用flutter方法的监听 ******************************************************/
  Future<dynamic> flutterDealNativeMethod(MethodCall methodCall) async{
    //原生传过来的数据的接受 这里要根据双方的定义来搞得
    final Map<dynamic, dynamic> res = methodCall.arguments;
    final  String item1 = res['item1'];
    final  String item2 = res['item2'];

    //这里可以有多个方法的处理
    switch (methodCall.method) {
      case 'fluMethod':
        print('原生调用了flutterMethod方法！！！');
        print('原生传递给flutter的参数是：' + item1 + " " + item2);
        break;
    }

    //这个是再次返回给原生的值
    return "这个还可以返回？";
  }


  /********************************************给flutter上层使用*********************************************/
  //获取原生系统版本的方法
  static Future<String> get platformVersion async {
    final String version = await _methodChannel.invokeMethod('getPlatformVersion');
    return version;
  }

  //调用原生的方法，给原生传参数， 并获取原生返回的值
  static Future<String> getNativeValue(String toNativeValue) async {
    final String resStr = await _methodChannel.invokeMethod('getNativeValue', <String, dynamic>{"message": toNativeValue});
    return resStr;
  }

}
